<?php
/**
 * Atomic封装
*/

namespace houze;
use houze\SingleCase;

class Atomic 
{
    use SingleCase;
    
    /**
     * 计数器的集合
    */
    private $list = [];
    
    private static $instance = null;
    
    /**
     * 门面实例
    */ 
    public static function run(){
        if (empty(self::$instance)) {
            self::$instance = new Atomic();
        }
        return self::$instance;
    }
    
    /**
     * 判断一个计数器是否存在
    */
    public function has($key) {
        return isset($this->list[$key]);
    }

    /**
     * 创建一个计数器
    */
    public function create($key, $num=0) {
        if ($this->has($key)) return false;

        $this->list[$key] = 0;
        return true;
    }
    
    /**
     * 销毁一个计数器
    */
    public function delete($key) {
        if (!$this->has($key)) return false;

        unset($this->list[$key]);
        return true;
    }
    
    /**
     * 计数器自增
    */
    public function setInc($key, $num=1) {
        if (!$this->has($key)) return false;

        $this->list[$key] = $this->list[$key] + $num;
        return true;
    }
    
    /**
     * 计数器自减
    */
    public function setDec($key, $num=1) {
        if (!$this->has($key)) return false;

        $this->list[$key] = $this->list[$key] - $num;
        return true;
    }
    
    /**
     * 获取计数器当前值
    */
    public function get($key) {
        if (!$this->has($key)) return false;

        return $this->list[$key];
    }
    
    /**
     * 直接重置计数器当前值
    */
    public function set($key, $num=0) {
        if (!$this->has($key)) return false;

        $this->list[$key] = $num;
        return true;
    }
    
    /**
     * 比较计数器当前值，通过则设置值
    */
    public function cmpset($key, $cmp, $num=0) {
        if (!$this->has($key)) return false;

        return $this->list[$key] = $num;
    }

    /**
     * 获取当前服务中的计数器个数
    */
    public function count() {
        return count($this->list);
    }
}